﻿//========================================================= 
/**@file LastErrGetter.h
 * @brief 错误信息获取器(封装LastErrExtractor使其更加容易配置)
 * 
 * @date 2016-10-05   19:32:29
 * @author Zhyioo 
 * @version 1.0
 */ 
//--------------------------------------------------------- 
#ifndef _LIBZHOUYB_LASTERRGETTER_H_
#define _LIBZHOUYB_LASTERRGETTER_H_
//--------------------------------------------------------- 
#include "LastErrExtractor.h"
//--------------------------------------------------------- 
namespace zhou_yb {
namespace extension {
namespace ability {
//--------------------------------------------------------- 
/**
 * @brief 错误信息获取器
 *
 * @code
 * getter.New("H002").Add("ID", idParser).Select("SDT", sdtapiAdapter).Add("PBOC", icAdapter).New("ICC").Add("CONTACT", contactIC).Add("CONTACTLESS", contactlessIC).End().Select("CMD", cmdAdapter).Add("DEV", dev).End();
 * @endcode
 *
 * @date 2016-10-05 23:04:04
 */
class LastErrGetter : 
    public IEnumerator<ReadOnlyEnumerator<LastErrExtractor> >, 
    public ILastErrBehavior, 
    public RefObject
{
public:
    /// 枚举器类型
    typedef ReadOnlyEnumerator<LastErrExtractor> EnumeratorType;
protected:
    /// 迭代器类型
    typedef list_t<LastErrExtractor>::iterator Iterator;
    /// 所有错误信息标签
    list_t<LastErrExtractor> _extractor_pool;
    /// 当前New新建项
    Iterator _currItr;
    /// 错误信息的跟标签
    Iterator _rootItr;
    /// 上一次最后创建的项
    Iterator _lastItr;
    /// 根迭代器表
    list_t<Iterator> _itr_pool;
public:
    LastErrGetter()
    {
        Clear();
    }
    /// 返回枚举器
    virtual EnumeratorType GetEnumerator() const
    {
        EnumeratorType enumer;
        typedef ListReadOnlyEnumerator<list_t<LastErrExtractor> > ListReadOnlyEnumeratorType;
        ListReadOnlyEnumeratorType* pNull = NULL;
        enumer.Create(_extractor_pool, pNull);
        return enumer;
    }
    /**
     * @brief 转到指定名称的错误配置信息
     * @date 2017-03-14 14:01
     * 
     * @param [in] name 需要跳转的名
     * @warning 只会返回第一个名称
     * 
     * @return LastErrGetter& 
     */
    LastErrGetter& MoveTo(const char* name)
    {
        if(name == NULL)
        {
            _currItr = _rootItr;
            _lastItr = _rootItr;
            return (*this);
        }
        Iterator itr = _extractor_pool.begin();
        // 跳过ROOT
        ++itr;

        ByteArray errName(name);
        for(;itr != _extractor_pool.end(); ++itr)
        {
            LastErrExtractor::EnumeratorType enumer = (*itr).GetEnumerator();
            while(enumer.MoveNext())
            {
                if(StringConvert::Compare(enumer.Current().Msg.c_str(), errName, true))
                {
                    _currItr = itr;
                    _lastItr = itr;
                    return (*this);
                }
            }
        }
        return (*this);
    }
    /// 在同一层中增加错误配置信息
    LastErrGetter& Add(const char* name, const Ref<ILastErrBehavior>& err)
    {
        Iterator itr = _extractor_pool.push_back();
        itr->IsFormatMSG = false;
        itr->IsLayerMSG = true;
        itr->Insert(err, name);
        _currItr->Insert(*itr);
        _lastItr = itr;
        return (*this);
    }
    /// 在同一层中增加错误配置信息
    inline LastErrGetter& Add(const Ref<ILastErrBehavior>& err)
    {
        return Add("", err);
    }
    /// 增加一层新的错误配置信息
    LastErrGetter& New(const char* name = NULL)
    {
        Iterator itr = _extractor_pool.push_back();
        itr->IsFormatMSG = false;
        itr->IsLayerMSG = false;

        _lastItr->Insert(*itr, name);
        _itr_pool.push_back(_lastItr);
        _currItr = itr;
        _lastItr = itr;
        return (*this);
    }
    /// 结束当前层的错误配置信息(需要和New调用对应)
    LastErrGetter& End()
    {
        if(_itr_pool.size() > 1)
        {
            _itr_pool.pop_back();
            _currItr = _itr_pool.back();
            _lastItr = _currItr;
        }
        return (*this);
    }
    /// 增加同一层中嵌套的错误配置信息
    LastErrGetter& Select(const char* name, const Ref<ILastErrBehavior>& err)
    {
        _lastItr->Insert(err, name);
        return (*this);
    }
    /// 增加同一层中嵌套的错误配置信息
    inline LastErrGetter& Select(const Ref<ILastErrBehavior>& err)
    {
        return Select("", err);
    }
    /// 清空错误配置信息
    LastErrGetter& Clear()
    {
        _extractor_pool.clear();
        _itr_pool.clear();

        Iterator itr = _extractor_pool.push_back();
        itr->IsFormatMSG = false;
        itr->IsLayerMSG = true;
        _itr_pool.push_back(itr);
        _rootItr = itr;
        _lastItr = itr;
        _currItr = itr;

        return (*this);
    }
    /// 获取错误码
    virtual int GetLastErr() const
    {
        return _rootItr->GetLastErr();
    }
    /// 获取错误的描述信息(string字符串描述)
    virtual const char* GetErrMessage()
    {
        return GetErrMessage(false);
    }
    /// 重置错误信息
    virtual void ResetErr()
    {
        _rootItr->ResetErr();
    }
    /// 获取错误信息
    const char* GetErrMessage(bool isFormat)
    {
        if(!isFormat)
        {
            return _rootItr->GetErrMessage();
        }
        list_t<LastErrExtractor>::iterator itr;
        for(itr = _extractor_pool.begin();itr != _extractor_pool.end(); ++itr)
            itr->IsFormatMSG = true;
        const char* msg = _rootItr->GetErrMessage();
        for(itr = _extractor_pool.begin();itr != _extractor_pool.end(); ++itr)
            itr->IsFormatMSG = false;
        return msg;
    }
};
//--------------------------------------------------------- 
} // namespace ability 
} // namespace extension 
} // namespace zhou_yb 
//--------------------------------------------------------- 
#endif // _LIBZHOUYB_LASTERRGETTER_H_
//========================================================= 